# https://blog.csdn.net/muzihuaner/article/details/108651316 依照这个博文做的
import time
import tkinter as tk
from tkinter.filedialog import askdirectory
import os
from tkinter.simpledialog import askstring

import PyPDF2
import tkinter.messagebox
from pdfAddNumber import PdfAddNumber
import traceback
from PyPDF2 import PdfFileMerger
from natsort import natsorted
from concurrent.futures import ThreadPoolExecutor, as_completed
from pdfConvert import doc2pdf, ppt2pdf, excel2pdf

window = tk.Tk()
window.title('QING PDF')
##窗口尺寸
window.geometry('500x500')

content_var = tk.StringVar()
content_var.set("点击按钮选择文件夹")

# label里显示的文字
save_text = ""


def save_job():
    """没错，这就是保存文件内容"""
    with open("pdfNumber.txt", "w") as fw:
        fw.write(save_text)
    tk.messagebox.showinfo(title='保存成功', message='保存的文件名为pdfNumber.txt！与此脚本在同一个文件夹内!\n之前的文件已经覆盖掉了哦！')


def do_job():
    text = """
    此脚本总计两个功能：
    第一、查看文件夹内所有pdf的页数，会在页面上显示，点击保存可以将信息保存到txt文件中，注意每次保存保存都会覆盖原文件！
    文件名为pdfNumber.txt！与此脚本在同一个文件夹内！
    第二、不仅查看，还可以重命名，在文件名末尾加上页数，具体为文件名=页数！
    共有2个注意点，一个是重命名之前注意备份，免得改完之后不好改回去！
    第二个就是此脚本对文件夹内的子文件夹也有效，也就是不仅对文件夹内的pdf文件有效，对其中的子文件夹内的pdf文件也有效！
    请注意！
    2021年12月
    没错，又有了2个新功能，添加页码和合并pdf，只对选择的文件夹内的pdf文件有效，对文件夹内的子文件夹无效。
    合并pdf文件时注意顺序，建议在文件名称前加上数字序号，确保按照所要的合并顺序！
    如1、文件.pdf  2、文件.pdf
    否则很有可能不会按照你所想的顺序运行。
    2022年2月
    修复BUG，对于pdf合并与生成目录页码，文件顺序很重要，但是这个文件排序有问题，现在已经修正，对于1.2、2.11等命名已经能够正常排序。
    2022年2月21日
    在有微软office的情况下，可以将文件下所有word、excel、PPT转换为pdf。
    在转换时确保文件夹下所有文件已关闭，不会转换失败。
    2022年3月1日
    """
    tk.messagebox.showinfo(title='功能说明', message=text)



# 获取文件夹内所有pdf文件，以及打印文件数量
def GetFileInfo(path, fileType=()):
    fileList = []

    # root 表示当前正在访问的文件夹路径
    # dirs 是 list , 表示该文件夹中所有的目录的名字(不包括子目录)
    # files 是 list , 表示内容是该文件夹中所有的文件(不包括子目录)
    # (每遍历一次相当于进入下级子目录)
    for root, dirs, files in os.walk(path):
        for name in files:
            fname = os.path.join(root, name)
            if fname.endswith(fileType):
                fileList.append(fname)

    print("总共有%d个PDF文件" % fileList.__len__())
    return fileList


def modify_file_name_function():
    """直接修改文件名"""
    # 弹出询问对话框
    result = tk.messagebox.askquestion(title='请选择是否继续', message='文件有备份吗？\n修改错误概不负责哦!')
    if result:
        file_dir = askdirectory()
        fileType = ("PDF", "pdf")
        fileList = GetFileInfo(path=file_dir, fileType=fileType)
        text = ""
        content_var.set("正在运行，请稍等。。。")
        window.update()
        for pdf in fileList:
            try:
                reader = PyPDF2.PdfFileReader(pdf, strict=False)
                # 获取单个文件页数
                pageNum = reader.getNumPages()
                print("文件" + pdf + "的页数=" + str(pageNum))
                portion = os.path.splitext(pdf)
                print(portion)
                new_pdf_name = portion[0] + "=" + str(pageNum) + "页" + portion[1]
                os.rename(pdf, new_pdf_name)
                text = text + os.path.basename(pdf) + "修改成功！！！\n"
                content_var.set(text)
                window.update()
            except Exception as e:
                print("-" * 70)
                print(pdf + "该文件出现异常，可能是权限问题")
                print(e)
                text = text + os.path.basename(pdf)
                print("-" * 70)
                content = "-" * 70 + "\n" + os.path.basename(pdf) + "该文件出现异常，可能是权限问题" + "\n"
                content = content + str(e) + "\n" + "*" * 70 + "\n"
                text = text + content
        content_var.set(text)
        global save_text
        save_text = text
    else:
        return 0


def generate_page_number():
    """对文件连续生成页码目录"""
    file_dir = askdirectory()
    fileType = ("PDF", "pdf")
    fileList = GetFileInfo(path=file_dir, fileType=fileType)
    fileList = natsorted(fileList)
    TotalPageNum = 1
    text = ""
    window.update()
    for pdf in fileList:
        try:
            reader = PyPDF2.PdfFileReader(pdf, strict=False)
            # 获取单个文件页数
            pageNum = reader.getNumPages()
            print("文件" + pdf + "   %d" % TotalPageNum)
            text = text + os.path.basename(pdf) + "  " + str(TotalPageNum) + "\n"
            TotalPageNum += pageNum
            content_var.set(text)
            window.update()
        except Exception as e:
            print("-" * 70)
            print(pdf + "该文件出现异常，可能是权限问题")
            print(e)
            text = text + os.path.basename(pdf)
            print("-" * 70)
            content = "-" * 70 + "\n" + os.path.basename(pdf) + "该文件出现异常，可能是权限问题" + "\n"
            content = content + str(e) + "\n" + "*" * 70 + "\n"
            text = text + content
    content_var.set(text)
    global save_text
    save_text = text


def pdf_add_number():
    """给pdf增加页码"""
    # 弹出询问对话框
    result = tk.messagebox.askquestion(title='请选择是否继续', message='添加页码的文件在output文件夹内，请注意区分！!')
    if result:
        pdf_add_number_function = PdfAddNumber()
        file_dir = askdirectory()
        print(file_dir)
        fileType = ("PDF", "pdf")
        dir_list = os.listdir(file_dir)
        print(dir_list)
        pdf_name_list = []
        for file in dir_list:
            if file.endswith(fileType):
                pdf_name_dir = os.path.join(file_dir, file)
                pdf_name_list.append(pdf_name_dir)
        text = ""
        if not os.path.isdir(file_dir + '/Output/'):
            os.mkdir(file_dir + '/Output/')
        new_file_dir = file_dir + '/Output/'
        content_var.set("正在运行，请稍等。。。")
        window.update()
        for pdf in pdf_name_list:
            try:
                pdf_add_number_function.startWritePdf(pdf, new_file_dir)
                text = text + os.path.basename(pdf) + "修改成功！！！\n"
                content_var.set(text)
                window.update()
            except Exception as e:
                print("-" * 70)
                print(pdf + "该文件出现异常，可能是权限问题")
                print(e)
                text = text + os.path.basename(pdf)
                print("-" * 70)
                content = "-" * 70 + "\n" + os.path.basename(pdf) + "该文件出现异常，可能是权限问题" + "\n"
                content = content + str(e) + "\n" + "*" * 70 + "\n"
                text = text + content
                traceback.print_exc()
        content_var.set(text)
        global save_text
        save_text = text
    else:
        return 0


def merge_pdf_all():
    """合并pdf文件"""
    # 弹出询问对话框
    result = tk.messagebox.askquestion(title='请选择是否继续', message='合并后的文件在output文件夹内。'
                            '\n请注意合并文件顺序，在每个文件名称前加上序号是一个很好的办法！！！')
    if result:
        file_dir = askdirectory()
        print(file_dir)
        fileType = ("PDF", "pdf")
        dir_list = os.listdir(file_dir)
        print(dir_list)
        pdf_name_list = []
        for file in dir_list:
            if file.endswith(fileType):
                pdf_name_dir = os.path.join(file_dir, file)
                pdf_name_list.append(pdf_name_dir)
        pdf_name_list = natsorted(pdf_name_list)
        text = ""
        merger = PdfFileMerger() # 合并所需要的
        content_var.set("正在运行，请稍等。。。")
        window.update()
        for pdf in pdf_name_list:
            try:
                merger.append(open(pdf, 'rb'))
                text = text + os.path.basename(pdf) + "已合并！！！\n"
            except Exception as e:
                print("-" * 70)
                print(pdf + "该文件出现异常，可能是权限问题")
                print(e)
                text = text + os.path.basename(pdf)
                print("-" * 70)
                content = "-" * 70 + "\n" + os.path.basename(pdf) + "该文件出现异常，可能是权限问题" + "\n"
                content = content + str(e) + "\n" + "*" * 70 + "\n"
                text = text + content
                traceback.print_exc()
        text = text + "\n合并结束！！！\n"
        content_var.set(text)
        var_string = askstring(title="请输入文件名称",
                               prompt="文件名称尽量只使用文字、数字、字母等，不要使用不常见符号防止脚本错误：")
        with open(file_dir + '/' + var_string + '.pdf', 'wb') as fout:  # 输出文件为newfile.pdf
            merger.write(fout)
        global save_text
        save_text = text
    else:
        return 0


def compute_pdfpage(path):
    """获取文件页数"""
    TotalPageNum = 0
    fileType = ("PDF", "pdf")
    fileList = GetFileInfo(path=path, fileType=fileType)
    text = ""
    for pdf in fileList:
        try:
            reader = PyPDF2.PdfFileReader(pdf, strict=False)
            # 获取单个文件页数
            pageNum = reader.getNumPages()
            print("文件" + pdf + "的页数=" + str(pageNum))
            text = text + os.path.basename(pdf) + "=" + str(pageNum) + "页\n"
            TotalPageNum += pageNum
        except Exception as e:
            print("-" * 70)
            print(pdf + "该文件出现异常，可能是权限问题")
            print(e)
            text = text + os.path.basename(pdf)
            print("-" * 70)
            content = "-" * 70 + "\n" + os.path.basename(pdf) + "该文件出现异常，可能是权限问题" + "\n"
            content = content + str(e) + "\n" + "*" * 70 + "\n"
            text = text + content
    text = text + "总计" + str(TotalPageNum) + "页\n"
    return text


def doc2pdf_tk():
    """word转pdf适用于office"""
    # 弹出询问对话框
    result = tk.messagebox.askquestion(title='请选择是否继续', message='转换的pdf文件与word在同一文件夹')
    if result:
        file_dir = askdirectory()
        fileType = ("doc", "docx")
        fileList = GetFileInfo(path=file_dir, fileType=fileType)
        for every_doc in fileList:
            if os.path.basename(every_doc).startswith("~$"):
                os.remove(every_doc)
                fileList.remove(every_doc)
        text = ""
        content_var.set("正在转换，请稍等。。。")
        window.update()
        # 这里是多线程
        with ThreadPoolExecutor(max_workers=5) as t:
            obj_list = []
            for doc_file in fileList:
                obj = t.submit(doc2pdf, doc_file)
                print("线程开启")
                obj_list.append(obj)
            # 返回的结果
            for future in as_completed(obj_list):
                data = future.result()
                print("一个线程结束")
                print(f"main: {data}")
                text = text + data
        content_var.set(text)
        global save_text
        save_text = text
    else:
        return 0


def excel2pdf_tk():
    """excel转pdf适用于office"""
    # 弹出询问对话框
    result = tk.messagebox.askquestion(title='请选择是否继续', message='转换的pdf文件与原文件在同一文件夹')
    if result:
        file_dir = askdirectory()
        fileType = ("xls", "xlsx")
        fileList = GetFileInfo(path=file_dir, fileType=fileType)
        for every_file in fileList:
            if os.path.basename(every_file).startswith("~$"):
                os.remove(every_file)
                fileList.remove(every_file)
        text = ""
        content_var.set("正在转换，请稍等。。。")
        window.update()
        # 这里是多线程
        with ThreadPoolExecutor(max_workers=5) as t:
            obj_list = []
            for excel_file in fileList:
                obj = t.submit(excel2pdf, excel_file)
                print("线程开启")
                obj_list.append(obj)
            # 返回的结果
            for future in as_completed(obj_list):
                data = future.result()
                print("一个线程结束")
                print(f"main: {data}")
                text = text + data
        content_var.set(text)
        global save_text
        save_text = text
    else:
        return 0


def ppt2pdf_tk():
    """ppt转pdf适用于office"""
    # 弹出询问对话框
    result = tk.messagebox.askquestion(title='请选择是否继续', message='转换的pdf文件与原文件在同一文件夹')
    if result:
        file_dir = askdirectory()
        fileType = ("ppt", "pptx")
        fileList = GetFileInfo(path=file_dir, fileType=fileType)
        for every_file in fileList:
            if os.path.basename(every_file).startswith("~$"):
                os.remove(every_file)
                fileList.remove(every_file)
        text = ""
        content_var.set("正在转换，请稍等。。。")
        window.update()
        # 这里是多线程
        with ThreadPoolExecutor(max_workers=5) as t:
            obj_list = []
            for ppt_file in fileList:
                obj = t.submit(ppt2pdf, ppt_file)
                print("线程开启")
                obj_list.append(obj)
            # 返回的结果
            for future in as_completed(obj_list):
                data = future.result()
                print("一个线程结束")
                print(f"main: {data}")
                text = text + data
        content_var.set(text)
        global save_text
        save_text = text
    else:
        return 0


# 按钮的函数,选择文件夹
def display_pdf_pages():
    """查看pdf文件页数"""
    file_dir = askdirectory()
    print(file_dir)
    content_var.set("正在运行，请稍等。。。")
    window.update()
    text = compute_pdfpage(file_dir)
    content_var.set(text)
    global save_text
    save_text = text


# 创建菜单
menubar = tk.Menu(window)
# 菜单一

function_description_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='功能说明', command=do_job)

# 菜单二
save_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='保存内容', command=save_job)
window.config(menu=menubar)

# 标签
label_remind = tk.Label(window, text='运行前可以先阅读功能说明哦！', bg='red').pack()

# 按钮
# 点击按钮执行一个名为“display_pdf_pages”的函数
b = tk.Button(window, text='我只想看看这个文件夹内pdf的页数', command=display_pdf_pages)
b.pack()

modify_file_name = tk.Button(window, text='不仅查看页数，还修改文件名在末尾加上页数', command=modify_file_name_function)
modify_file_name.pack()

# 第三个按钮
generate_page_number_button = tk.Button(window, text='生成目录页数', command=generate_page_number)
generate_page_number_button.pack()

# 第四个按钮，添加页码
add_number_button = tk.Button(window, text='给文件夹中的pdf文件添加页码', command=pdf_add_number)
add_number_button.pack()

# 第五个按钮，合并pdf
merge_pdf_button = tk.Button(window, text='合并文件夹中的pdf文件', command=merge_pdf_all)
merge_pdf_button.pack()

# 第六个按钮，word转pdf
doc2pdf_button = tk.Button(window, text='word转pdf(office)', command=doc2pdf_tk)
doc2pdf_button.pack()

# 第七个按钮，excel转pdf
excel2pdf_button = tk.Button(window, text='excel转pdf(office)', command=excel2pdf_tk)
excel2pdf_button.pack()

# 第八个按钮，ppt转pdf
ppt2pdf_button = tk.Button(window, text='ppt转pdf(office)', command=ppt2pdf_tk)
ppt2pdf_button.pack()

# 新建一个label
label_explain = tk.Label(window, textvariable=content_var, bg='yellow')

# 标签的显示
label_explain.pack()
# 显示出来
window.mainloop()



